// 文件名：stack_resource_scope.cpp
// 目的：用“栈”维护资源作用域的进入/离开，演示成对获取/释放的管理模式。
// 模型：
//   - Resource：构造打印“获取”，析构打印“释放”；
//   - scopeStack：栈内存放 Resource*，enterScope 时 new 出对象压栈，leaveScope 时 delete 栈顶并出栈；
//   - 最后通过循环 leaveScope 释放剩余资源，确保无泄漏。
// 复杂度：push/pop/top/empty 均摊 O(1)。
// 注意：
//   - 示例使用裸指针管理资源，实际生产中推荐使用智能指针（如 std::unique_ptr<Resource>）或直接按值存储，
//     以确保异常安全与自动释放（RAII）。
//   - leaveScope 前必须检查栈是否为空，避免下溢。

#include <iostream>
#include <stack>
#include <string>

struct Resource {
    std::string id;
    explicit Resource(std::string name) : id(std::move(name)) {
        std::cout << "Acquire resource: " << id << '\n';
    }
    ~Resource() {
        std::cout << "Release resource: " << id << '\n';
    }
};

int main() {
    std::stack<Resource*> scopeStack;

    auto enterScope = [&](const std::string& name) {
        scopeStack.push(new Resource{name});
    };

    auto leaveScope = [&]() {
        if (scopeStack.empty()) {
            std::cerr << "Scope stack empty!\n";
            return;
        }
        delete scopeStack.top();
        scopeStack.pop();
    };

    enterScope("ConfigFile");
    enterScope("DatabaseConnection");
    leaveScope(); // release DatabaseConnection

    enterScope("TempBuffer");
    while (!scopeStack.empty()) {
        leaveScope(); // release remaining resources
    }

    return 0;
}